【X68000(Z)アセンブラ講座 第002回 : X68000(Z)のMPU(CPU)とメモリー】 2024/12/04   こんにちは☆ 今回はタイトルに書いたパーツについて それぞれのゲームプログラミングに関する知識に限定して説明します。 [ MPU:MC68000 ] データレジスター(d0〜d7)を8本とアドレスレジスター(a0〜a7)を8本持ちます。 レジスターとはMPU内部のそれぞれの役割を持つ高速メモリーです。 データレジスターもアドレスレジスターもPC内部で一番速いメモリーで数値データを格納するので ハードウェア変数と呼んでも間違いはありません。 データレジスターは主に計算に用いられます。 アドレスとは主にメモリー上の番地の事です。 アドレスレジスターにアドレスを代入してメモリーにアクセスするのが基本です。 これらのレジスターは全て最大32ビット幅(4バイト分)で、 扱うデータのサイズによって ・バイト(8ビット幅/1バイト分の長さ) ・ワード(16ビット幅/2バイト分の長さ) ・ロングワード(32ビット幅/4バイト分の長さ) : 以後ロングと略す事あり これら3つのサイズのうち一つを選択して各種命令を実行します。 注意点としてバイトサイズでアドレスレジスターを使う事はできません。 a0〜a7のうちa7はSPと言う別名を持っていてスタックポインターの役割を果たします。 SPの役割については後程説明します。 その他、PC(プログラムカウンター)と言う重要な32ビット幅のレジスターがあります。 PCはメモリー上の現在実行中のアドレスが格納されます。 X68000(Z)の68000MPUにはユーザーモードとスーパーバイザーモードの2つの状態があります。 ソフト起動時はユーザーモードでプログラムが動き始めて 全メモリー空間16MBのうち12MBのメインメモリーにしかアクセスできず 12MB以降のシステムメモリー空間にアクセスするとエラーになります。 スーパーバイザーモードに切り替えると12MB以降の4MBのシステムメモリーにもアクセス可能になり、 遅いと言われているIOCS(BIOS)コールでの機能実行を避けて プログラマーが書いた高速化プログラムで機能実行すれば最適化になります。 例えばCG画面に画像を描画する場合は簡単に便利にIOCSで描画できるように設計されていて 安全確実にCG描画できるようになっていますが、 そこから安全確実を残すのは当たり前として便利さを犠牲にして 新たなる高速描画プログラムを書けば立派な最適化と言う事になります。 ここら辺は今は参考程度に捉えておいて下さい。 あ、書き忘れましたが、 例えば32ビットと言うのは2進法で32桁と言う事です。 [ メモリー ] X68000Zに搭載されている68000MPUのメモリー空間は16MB。 そのうちX68000Zのメインメモリーは最大12MB。 その後ろのシステムメモリー4MBの中に各種VRAMや機能制御用メモリーなどが配置されています。 今回はメインメモリーと68000MPUのデータの流れを中心に解説します。 お気付きの方もいると思いますが、 「アドレスレジスターが32ビット幅ならメモリー空間は4GBでは?」と 突っ込みを入れたくなったと思います。 それは32ビット版680x0MPUにおいては大正解です。 しかし68000MPUにおいては事情が違っていて 68000MPU開発当時は4GB搭載してもメモリー空間が広すぎると言う事で 32ビットのアドレスバス(番地信号線)のうち上位8ビットをカットして無効にして 残りの24ビットアドレスの範囲の16MBメモリー空間が仕様となりました。 (故にアドレスバスの通っていないアドレスレジスターの上位8ビットの部分は どんな数値を入れてもプログラム的に影響を受けないらしく「8ビット = 1バイト」と言う事で そこを1バイトデータの隠し場所として使っていたゲーム会社の強者の先輩がいました(^^;) 68000MPUは16ビットMPUなのでメモリーとは16ビット幅のデータバス上でデータが行き来します。 プログラム的には「8ビット = 1バイト」でC/C++言語のように気楽にプログラミングできるが、 ハードウェア的にはメモリー空間は先頭から最後までデータバス16ビットの幅毎に区切られているので ワードサイズ(16ビット)やバイトサイズ(8ビット)でメモリーアクセスする時は全速力で読み書きできますが ロングサイズ(32ビット)アクセスの時には16ビットアクセスが2回入るので命令実行は多少遅くなります。 68000MPUでメモリーアクセスする時に注意すべき点は、 ワードサイズやロングサイズでアクセスする時に奇数アドレスを指定してはいけないと言う事です。 (16ビット毎に区切られたメモリーに一度のアクセスで隣り合った16ビットデータ両方を同時に処理する仕組みを追加すると IntelのCPUのように色々な無駄が発生するから省いたのでしょう。) このルールに違反するとアドレスエラーが発生してしまいます。 ソースコードの中のファイル名文字列や独自のエラーメッセージ等の文字列データのサイズが 奇数か偶数か計算するのが面倒な場合などに文字列データの次の行に'.even'キーワードを一行追加すると その次の行以降のワードデータやロングデータの配置を偶数アドレスから始まるように調整してくれます。 [EOF]